package balance

import (
	"hash/crc32"
	"net/http"
	"strings"
)

// ip-hash策略
func (service *Service) ipHashBalance(req *http.Request) (int, error) {
	index := int(crc32.ChecksumIEEE([]byte(crcIPAddr(req.RemoteAddr)))) % service.CountInfo.Len

	return index, nil
}

// ip v4 or v6
func isIPV4(ip string) bool {
	if strings.Index(ip, ".") > 0 {
		return true
	}

	return false
}

/*	crcIPAddr
	ip v4的，保证ip地址前三位相同的用户经过hash计算将分配到相同的后端server，前三段相同，表示在同一个网络或邻近网络
	ip v6的，直接返回全部ip地址
*/
func crcIPAddr(ip string) string {
	if isIPV4(ip) {
		lastDotIndex := strings.LastIndex(ip, ".")
		return ip[:lastDotIndex]
	}

	return ip
}
